//
// Created by Crestimes on 24-6-2.
//

#ifndef PRODUCTIONMANAGER_H
#define PRODUCTIONMANAGER_H
#include <vector>
#include <set>
#include <fstream>
#include <map>

#include "Production.h"
using namespace std;


// 文法语句管理类
class ProductionManager {
public:
    ProductionManager(const vector<string>& productionBuffs, const vector<string>& prodBuildTypeBuffs);
    vector<Production> productions; // 文法语句集合
    map<string, Character*> nameToCharacter; // 用名称字符映射到对应的Character实例
    map<string, vector<Production>> nameToProductions; // 用名称字符(非终结符)映射到对应的文法语句列表
    set<Character*> nullableCharSet; // Nullable集合
    static set<Character*> calcFirstSSet(const Production& production); // 由文法语句计算出其First_S集合
    static set<Character*> calcExpectationSet(const vector<Character*>& charsAfterN,
                                              const set<Character*>& LastExpectationSet);

private:
    vector<string> productionBuffs; // 文法文件的内容
    vector<string> prodBuildTypeBuffs; // 文法建点操作类型文件的内容
    void initProductions(); // 初始化productions成员变量
    void initNullableCharSet(); // 初始化nullableCharSet成员变量
    void initCharFirstSet(); // 初始化每个非终结符的First集合
    void initCharFollowSet(); // 初始化每个非终结符的Follow集合
    void initExpectationSet(); // 初始化每条文法的expectationSet
};


#endif //PRODUCTIONMANAGER_H
